package com.xuecheng.learning.service.impl;

import com.alibaba.fastjson.JSON;
import com.xuecheng.base.model.RestResponse;
import com.xuecheng.content.model.dto.TeachPlanDto;
import com.xuecheng.content.model.po.CoursePublish;
import com.xuecheng.learning.feignclient.ContentServiceClient;
import com.xuecheng.learning.feignclient.MediaServiceClient;
import com.xuecheng.learning.model.dto.XcCourseTablesDto;
import com.xuecheng.learning.service.LearningService;
import com.xuecheng.learning.service.MyCourseTablesService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
@RequiredArgsConstructor
public class LearningServiceImpl implements LearningService {

    private final MyCourseTablesService myCourseTablesService;

    private final ContentServiceClient contentServiceClient;

    private final MediaServiceClient mediaServiceClient;

    /**
     * 获取教学视频
     *
     * @param userId      用户id
     * @param courseId    课程id
     * @param teachplanId 课程计划id
     * @param mediaId     媒资文件id
     * @return RestResponse<java.lang.String>
     */
    @Override
    public RestResponse<String> getVideo(String userId, Long courseId, Long teachplanId, String mediaId) {
        // 查询课程信息
        CoursePublish coursepublish = contentServiceClient.getCoursepublish(courseId);
        if (coursepublish == null) {
            return RestResponse.validfail("课程不存在");
        }

        // todo 是否可以试学
        // 远程调用内容管理服务 根据课程计划id查询课程计划信息 如果is_preview为1表示可以试学
        // 也可以从coursePublish中解析出课程计划信息去判断是否支持试学
        // 获取课程所有的课程计划
        String teachPlanJson = coursepublish.getTeachplan();
        // 把所有的课程计划转成List集合
        List<TeachPlanDto> teachPlanDtos = JSON.parseArray(teachPlanJson, TeachPlanDto.class);
        for (TeachPlanDto teachPlanDto : teachPlanDtos) {
            if ("1".equals(teachPlanDto.getIsPreview())) {
                // 说明可以试学 远程调用媒资服务获取视频播放地址
                return mediaServiceClient.getPlayUrlByMediaId(mediaId);
            } else {
                return RestResponse.validfail("该课程没有试看权限");
            }
        }

        // 用户已登录
        if (StringUtils.isNotEmpty(userId)) {
            // 获取学习资格
            XcCourseTablesDto xcCourseTablesDto = myCourseTablesService.getLearningStatus(userId, courseId);
            // 获取学习资格
            String learnStatus = xcCourseTablesDto.getLearnStatus();
            if ("702002".equals(learnStatus)) {
                return RestResponse.validfail("无法学习，因为选课后没有支付");
            } else if ("702003".equals(learnStatus)) {
                return RestResponse.validfail("已过期");
            } else {
                // 有资格学习
                // 远程调用媒资服务获取视频的播放地址
                return mediaServiceClient.getPlayUrlByMediaId(mediaId);
            }
        }

        // 如果没有登录取出收费规则
        String charge = coursepublish.getCharge();
        if ("201000".equals(charge)) {
            // 有资格学习
            // 远程调用媒资服务获取视频的播放地址
            return mediaServiceClient.getPlayUrlByMediaId(mediaId);
        }

        return RestResponse.validfail("该课程没有选课");
    }
}
